/* Copyright (c) 2012 Stanford University
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR(S) DISCLAIM ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL AUTHORS BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include "RPC/Service.h"

#ifndef LOGCABIN_SERVER_RAFTSERVICE_H
#define LOGCABIN_SERVER_RAFTSERVICE_H

namespace LogCabin {
namespace Server {

// forward declaration
class Globals;

// TODO(ongaro): doc
class RaftService : public RPC::Service {
  public:
    /// Constructor.
    explicit RaftService(Globals& globals);

    /// Destructor.
    ~RaftService();

    void handleRPC(RPC::ServerRPC rpc);
    std::string getName() const;

  private:

    ////////// RPC handlers //////////

    void requestVote(RPC::ServerRPC rpc);
    void appendEntries(RPC::ServerRPC rpc);
    void installSnapshot(RPC::ServerRPC rpc);

    /**
     * The LogCabin daemon's top-level objects.
     */
    Globals& globals;

  public:

    // RaftService is non-copyable.
    RaftService(const RaftService&) = delete;
    RaftService& operator=(const RaftService&) = delete;
}; // class RaftService

} // namespace LogCabin::Server
} // namespace LogCabin

#endif /* LOGCABIN_SERVER_RAFTSERVICE_H */
